﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Controls.Maps;
using System.Device.Location;

namespace OptymalizatorTrasy
{
    public partial class Dodawanie : PhoneApplicationPage
    {
        private MapLayer layerP = (App.Current as App).layerP; //stworzenie warsty pinesek oraz przypisanie do niej analogicznej zmiennej globalnej
        private String poprzedni = "mapa"; //zamienna pomocnicza służąca do przetrzymywania poprzedniej opcji dodawania 
        private Geokodowanie geoKoder; //utworzenie elementu do geokodowanie

        public Dodawanie()
        {
            InitializeComponent();
            //dodanie domyślnej nazwy do pola tekstowego
            nazwa.Text = Convert.ToString("pineska" + (App.Current as App).indexPinesek);
            geoKoder = new Geokodowanie(layerP,null);
        }

        //obsługa radiobuttonow: wyswietlenie odpowiednich komponentów dla odpowiednio wybranej opcji dodawania
        #region radioButton
        private void Radio_Checked(object sender, EventArgs e)
        {
            RadioButton checkedRadio = sender as RadioButton;

            switch (checkedRadio.Name)
            {
                case "mapa":

                    if (poprzedni.CompareTo("adres") == 0)
                        {
                            widocznoscAdres(System.Windows.Visibility.Collapsed);
                            ustawMargines(127);                           
                        }
                        else if (poprzedni.CompareTo("wspolrzedne") == 0)
                        {
                            widocznoscWspolrzedne(System.Windows.Visibility.Collapsed);
                        }

                        poprzedni = "mapa";
                        break;

                case "adres":
                        
                        widocznoscAdres(System.Windows.Visibility.Visible);
                        ustawMargines(408);

                        if (poprzedni.CompareTo("wspolrzedne") == 0)
                        {
                            widocznoscWspolrzedne(System.Windows.Visibility.Collapsed);
                        }

                        poprzedni = "adres";
                        break;

                case "wspolrzedne":

                        widocznoscWspolrzedne(System.Windows.Visibility.Visible);
                        ustawMargines(127);

                        if (poprzedni.CompareTo("adres") == 0)
                        {
                            widocznoscAdres(System.Windows.Visibility.Collapsed);
                        }
                        
                        poprzedni = "wspolrzedne";
                        break;
            }
        }
        
        //ustawienie widoczności elementów dla wybrania opcji dodawania: ADRES
        private void widocznoscAdres(System.Windows.Visibility v)
        {
            textBlock1.Visibility = v;
            textBlock2.Visibility = v;
            textBlock3.Visibility = v;
            textBlock4.Visibility = v;
            miasto.Visibility = v;
            ulica.Visibility = v;
            numer.Visibility = v;
            kraj.Visibility = v;
        }

        //ustawienie widoczności elementów dla wybrania opcji dodawania: WSPÓŁRZĘDNE
        private void widocznoscWspolrzedne(System.Windows.Visibility v)
        {
            textBlock5.Visibility = v;
            textBlock6.Visibility = v;
            szerokosc.Visibility = v;
            dlugosc.Visibility = v;
        }

        //ustawienie marginesu górnego dla opcji Współrzędnych
        private void ustawMargines(int margines)
        {
            Thickness margin = wspolrzedne.Margin;
            margin.Top = margines;
            wspolrzedne.Margin = margin;
        }
        #endregion

        //obsługa kliknięcia któregoś z guzików
        #region przyciski
        private void Button_Click(object sender, EventArgs e)
        {
            Button clickedButton = sender as Button;
            switch (clickedButton.Name)
            {
                case "anuluj": //w przypadku guzika Anuluj nawigujemy wstecz, do strony z mapą, bez wprowadzania żadnych zmian
                    NavigationService.Navigate(new Uri("/MainPage.xaml?status=anulowanie", UriKind.Relative));
                    break;

                case "dodaj": //w przypadku guzika Dodaj w zależności od trybu dodawania dodajemy pineskę
                   
                    if (mapa.IsChecked == true) //jeśli dodajemy za pomocą ustawienia pineski na mapie, dodajemy nową pineskę do mapy i wracamy na mapę by ją ustawić
                    {
                        NavigationService.Navigate(new Uri("/MainPage.xaml?status=doDodania&nazwa="+nazwa.Text, UriKind.Relative));
                    }
                    else if (adres.IsChecked == true) //dodawanie pineski na podstawie wpisanego adresu
                    {

                        if (miasto.Text.CompareTo("") != 0 && nazwa.Text.CompareTo("") != 0)
                        {
                            nowaPineskaADRES();
                            NavigationService.Navigate(new Uri("/MainPage.xaml?status=dodana", UriKind.Relative));
                        }
                        else
                        {
                            if (miasto.Text.CompareTo("") == 0) pusteMiasto.Begin();
                            if (nazwa.Text.CompareTo("") == 0) pusteNazwa.Begin();
                        }
                    }
                    else //dodanie pineski na podstawie wpisanych współrzędnych
                    {
                        if (dlugosc.Text.CompareTo("") != 0 && szerokosc.Text.CompareTo("") != 0 && nazwa.Text.CompareTo("") != 0)
                        {
                            nowaPineskaWSP(new GeoCoordinate(Convert.ToDouble(szerokosc.Text),Convert.ToDouble(dlugosc.Text)));
                            NavigationService.Navigate(new Uri("/MainPage.xaml?status=dodana", UriKind.Relative));
                        }
                        else
                        {
                            if (dlugosc.Text.CompareTo("") == 0) pusteDlugosc.Begin();
                            if (szerokosc.Text.CompareTo("") == 0) pusteSzerokosc.Begin();
                            if (nazwa.Text.CompareTo("") == 0) pusteNazwa.Begin();

                        }
                    }

                    break;

                case "next": //obsługa wciśnięcia guzika Następny (Dodanie pineski + przygotowanie do wpisania następnej)
                    
                    if (adres.IsChecked == true) //dodajemy pineskę na podstawie wpisanego adresu
                    {

                        if (miasto.Text.CompareTo("") != 0 && nazwa.Text.CompareTo("") != 0)
                        {
                            nowaPineskaADRES();

                            nazwa.Text = "";
                            kraj.Text = "";
                            miasto.Text = "";
                            ulica.Text = "";
                            numer.Text = "";                          
                        }
                        else
                        {
                            if (miasto.Text.CompareTo("") == 0) pusteMiasto.Begin();
                            if (nazwa.Text.CompareTo("") == 0) pusteNazwa.Begin();
                        }
                    }
                    else
                    {
                        if (dlugosc.Text.CompareTo("") != 0 && szerokosc.Text.CompareTo("") != 0 && nazwa.Text.CompareTo("") != 0)
                        {
                            nowaPineskaWSP(new GeoCoordinate(Convert.ToDouble(szerokosc.Text), Convert.ToDouble(dlugosc.Text)));
                            szerokosc.Text = "";
                            dlugosc.Text = "";
                        }
                        else
                        {
                            if (dlugosc.Text.CompareTo("") == 0) pusteDlugosc.Begin();
                            if (szerokosc.Text.CompareTo("") == 0) pusteSzerokosc.Begin();
                            if (nazwa.Text.CompareTo("") == 0) pusteNazwa.Begin();

                        }
                    }
                    nazwa.Text = Convert.ToString("pineska" + (App.Current as App).indexPinesek++); //wpisanie kolejnej nazwy do pola
                    break;
            }
        }
        #endregion

        //funkcje dodawania nowych pinesek po adresie lub współrzędnych
        #region dodawaniePinesek
        //dodanie nowej pineski do mapy na podstawie współrzędnych
        private void nowaPineskaWSP(GeoCoordinate geo)
        {
            Pushpin nowyPin = new Pushpin();
            nowyPin.Location = geo;
            nowyPin.Content = nazwa.Text;
            layerP.Children.Add(nowyPin);
            (App.Current as App).indexPinesek++;
            (App.Current as App).srodek = geo;
        }

        //dodanie nowej pineski do mapy na podstawie adresu
        private void nowaPineskaADRES()
        {
            String adres = "";

            if (ulica.Text.CompareTo("") != 0) adres += ulica.Text + numer.Text + ",";
            adres += miasto.Text;
            if (kraj.Text.CompareTo("") != 0) adres += "," + kraj.Text;

            geoKoder.zamienAdresNaPinezke(adres,false);
            (App.Current as App).indexPinesek++;

        }

        #endregion
        
        //dodanie filtrów na pola tekstowe do wpisywania współrzędnych, tak aby możnabyło wpisywać jedynie cyfry, . i znak -
        #region klawiaturaWspolrzednych
        private void Numeric_KeyUp(object sender, KeyEventArgs e)
        {
            TextBox poleTekstowe = (TextBox)sender;
            string[] niedozwoloneZnaki = { "*", "#", ",", "(", ")", "x", "+", " ", "@" };

            for (int index = 0; index < niedozwoloneZnaki.Length; index++)
            {
                poleTekstowe.Text = poleTekstowe.Text.Replace(niedozwoloneZnaki[index], "");
            }
            poleTekstowe.SelectionStart = poleTekstowe.Text.Length;
        }

        private void Numeric_KeyDown(object sender, KeyEventArgs e)
        {
            TextBox poleTekstowe = (TextBox)sender;
            if (poleTekstowe.Text.Contains(".") && e.PlatformKeyCode == 190)
            {
                e.Handled = true;
            }
            if (poleTekstowe.Text.Contains("-"))
            {
                e.Handled = true;
            }

        }

        #endregion

    }
}